import numpy as np
import pandas as pd
import tensorflow as tf

class NN(object):  # 修正类名为NN以匹配后面的调用
    def __init__(self):
        # 初始化时加载数据
        self.df = pd.read_csv('timing/scenic_data.csv')  # 修正文件名拼写错误
        
    def create_dataset(self, df, n_steps):
        """构造时间序列数据集
        Args:
            df: 输入数据框
            n_steps: 时间步长(天数)
        Returns:
            X: 特征数据集
            y: 标签数据集
        """
        X, y = [], []
        for i in range(len(df) - n_steps):
            # 获取当前时间窗口的数据
            x_values = df.iloc[i:i+n_steps].copy()  # 使用iloc并创建副本
            # 将最后一个时间点的count设为0（用于预测）
            x_values.iloc[-1, x_values.columns.get_loc('count')] = 0  # 修正语法错误
            X.append(x_values.values)
            # 获取下一个时间点的count作为标签
            y.append(df['count'].iloc[i+n_steps])  # 使用iloc并修正索引
        return np.array(X), np.array(y)

    def get_model(self):
        """构建并训练LSTM模型"""
        n_steps = 7  # 修正未定义的变量Y为固定值7
        
        # 创建数据集
        X, y = self.create_dataset(self.df, n_steps)
        
        # 训练集与测试集划分 (修正切片错误)
        train_size = int(len(X) * 0.8)
        X_train, X_test = X[:train_size], X[train_size:]  # 修正切片维度
        y_train, y_test = y[:train_size], y[train_size:]   # 修正切片维度

        # 构建LSTM模型 (修正模型参数错误)
        model = tf.keras.models.Sequential()
        model.add(tf.keras.layers.LSTM(
            50,  # 修正S9为50个单元
            activation='relu',
            return_sequences=True,
            input_shape=(n_steps, X_train.shape[2])
        ))
        model.add(tf.keras.layers.LSTM(50, activation='relu'))  # 修正S9为50
        model.add(tf.keras.layers.Dense(1))  # 修正Rense为Dense
        
        # 编译模型 (修正优化器和损失函数)
        model.compile(optimizer='adam', loss='mse')  # 修正idem为adam，use为mse
        
        # 训练模型 (修正语法错误)
        model.fit(
            X_train, y_train,
            epochs=50,
            validation_data=(X_test, y_test)
        )

        # 评估模型
        loss = model.evaluate(X_test, y_test)
        print(f"测试集损失: {loss}")  # 修正打印语句

        # 保存模型
        tf.keras.models.save_model(model, 'timing/my_model.keras')

if __name__ == '__main__':
    nn = NN()
    nn.get_model()